// Copyright 2018 David Conran

#include "IRrecv.h"
#include "IRsend.h"
#include "IRsend_test.h"
#include "gtest/gtest.h"

// Tests for sendCarrierAC()

// Test sending typical data only.
TEST(TestSendCarrierAC, SendDataOnly) {
  IRsendTest irsend(0);
  irsend.begin();

  irsend.reset();
  irsend.sendCarrierAC(0x0);
  EXPECT_EQ(
      "m8532s4228"
      "m628s532m628s532m628s532m628s532m628s532m628s532m628s532m628s532"
      "m628s532m628s532m628s532m628s532m628s532m628s532m628s532m628s532"
      "m628s532m628s532m628s532m628s532m628s532m628s532m628s532m628s532"
      "m628s532m628s532m628s532m628s532m628s532m628s532m628s532m628s532"
      "m628s20000"
      "m8532s4228"
      "m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320"
      "m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320"
      "m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320"
      "m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320m628s1320"
      "m628s20000"
      "m8532s4228"
      "m628s532m628s532m628s532m628s532m628s532m628s532m628s532m628s532"
      "m628s532m628s532m628s532m628s532m628s532m628s532m628s532m628s532"
      "m628s532m628s532m628s532m628s532m628s532m628s532m628s532m628s532"
      "m628s532m628s532m628s532m628s532m628s532m628s532m628s532m628s532"
      "m628s20000", irsend.outputStr());
  irsend.reset();
  irsend.sendCarrierAC(0x12345678);
  EXPECT_EQ(
      "m8532s4228"
      "m628s532m628s532m628s532m628s1320m628s532m628s532m628s1320m628s532"
      "m628s532m628s532m628s1320m628s1320m628s532m628s1320m628s532m628s532"
      "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s1320m628s532"
      "m628s532m628s1320m628s1320m628s1320m628s1320m628s532m628s532m628s532"
      "m628s20000"
      "m8532s4228"
      "m628s1320m628s1320m628s1320m628s532m628s1320m628s1320m628s532m628s1320"
      "m628s1320m628s1320m628s532m628s532m628s1320m628s532m628s1320m628s1320"
      "m628s1320m628s532m628s1320m628s532m628s1320m628s532m628s532m628s1320"
      "m628s1320m628s532m628s532m628s532m628s532m628s1320m628s1320m628s1320"
      "m628s20000"
      "m8532s4228"
      "m628s532m628s532m628s532m628s1320m628s532m628s532m628s1320m628s532"
      "m628s532m628s532m628s1320m628s1320m628s532m628s1320m628s532m628s532"
      "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s1320m628s532"
      "m628s532m628s1320m628s1320m628s1320m628s1320m628s532m628s532m628s532"
      "m628s20000", irsend.outputStr());

  irsend.reset();
  irsend.sendCarrierAC(0x4CCA541D);
  EXPECT_EQ(
      "m8532s4228"
      "m628s532m628s1320m628s532m628s532m628s1320m628s1320m628s532m628s532"
      "m628s1320m628s1320m628s532m628s532m628s1320m628s532m628s1320m628s532"
      "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s532m628s532"
      "m628s532m628s532m628s532m628s1320m628s1320m628s1320m628s532m628s1320"
      "m628s20000"
      "m8532s4228"
      "m628s1320m628s532m628s1320m628s1320m628s532m628s532m628s1320m628s1320"
      "m628s532m628s532m628s1320m628s1320m628s532m628s1320m628s532m628s1320"
      "m628s1320m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s1320"
      "m628s1320m628s1320m628s1320m628s532m628s532m628s532m628s1320m628s532"
      "m628s20000"
      "m8532s4228"
      "m628s532m628s1320m628s532m628s532m628s1320m628s1320m628s532m628s532"
      "m628s1320m628s1320m628s532m628s532m628s1320m628s532m628s1320m628s532"
      "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s532m628s532"
      "m628s532m628s532m628s532m628s1320m628s1320m628s1320m628s532m628s1320"
      "m628s20000", irsend.outputStr());
}

// Test sending typical data only.
TEST(TestSendCarrierAC, SendWithRepeats) {
  IRsendTest irsend(0);
  irsend.begin();

  irsend.reset();
  irsend.sendCarrierAC(0x12345678, CARRIER_AC_BITS, 2);  // two repeats.
  EXPECT_EQ(
    "m8532s4228"
    "m628s532m628s532m628s532m628s1320m628s532m628s532m628s1320m628s532"
    "m628s532m628s532m628s1320m628s1320m628s532m628s1320m628s532m628s532"
    "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s1320m628s532"
    "m628s532m628s1320m628s1320m628s1320m628s1320m628s532m628s532m628s532"
    "m628s20000"
    "m8532s4228"
    "m628s1320m628s1320m628s1320m628s532m628s1320m628s1320m628s532m628s1320"
    "m628s1320m628s1320m628s532m628s532m628s1320m628s532m628s1320m628s1320"
    "m628s1320m628s532m628s1320m628s532m628s1320m628s532m628s532m628s1320"
    "m628s1320m628s532m628s532m628s532m628s532m628s1320m628s1320m628s1320"
    "m628s20000"
    "m8532s4228"
    "m628s532m628s532m628s532m628s1320m628s532m628s532m628s1320m628s532"
    "m628s532m628s532m628s1320m628s1320m628s532m628s1320m628s532m628s532"
    "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s1320m628s532"
    "m628s532m628s1320m628s1320m628s1320m628s1320m628s532m628s532m628s532"
    "m628s20000"
    "m8532s4228"
    "m628s532m628s532m628s532m628s1320m628s532m628s532m628s1320m628s532"
    "m628s532m628s532m628s1320m628s1320m628s532m628s1320m628s532m628s532"
    "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s1320m628s532"
    "m628s532m628s1320m628s1320m628s1320m628s1320m628s532m628s532m628s532"
    "m628s20000"
    "m8532s4228"
    "m628s1320m628s1320m628s1320m628s532m628s1320m628s1320m628s532m628s1320"
    "m628s1320m628s1320m628s532m628s532m628s1320m628s532m628s1320m628s1320"
    "m628s1320m628s532m628s1320m628s532m628s1320m628s532m628s532m628s1320"
    "m628s1320m628s532m628s532m628s532m628s532m628s1320m628s1320m628s1320"
    "m628s20000"
    "m8532s4228"
    "m628s532m628s532m628s532m628s1320m628s532m628s532m628s1320m628s532"
    "m628s532m628s532m628s1320m628s1320m628s532m628s1320m628s532m628s532"
    "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s1320m628s532"
    "m628s532m628s1320m628s1320m628s1320m628s1320m628s532m628s532m628s532"
    "m628s20000"
    "m8532s4228"
    "m628s532m628s532m628s532m628s1320m628s532m628s532m628s1320m628s532"
    "m628s532m628s532m628s1320m628s1320m628s532m628s1320m628s532m628s532"
    "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s1320m628s532"
    "m628s532m628s1320m628s1320m628s1320m628s1320m628s532m628s532m628s532"
    "m628s20000"
    "m8532s4228"
    "m628s1320m628s1320m628s1320m628s532m628s1320m628s1320m628s532m628s1320"
    "m628s1320m628s1320m628s532m628s532m628s1320m628s532m628s1320m628s1320"
    "m628s1320m628s532m628s1320m628s532m628s1320m628s532m628s532m628s1320"
    "m628s1320m628s532m628s532m628s532m628s532m628s1320m628s1320m628s1320"
    "m628s20000"
    "m8532s4228"
    "m628s532m628s532m628s532m628s1320m628s532m628s532m628s1320m628s532"
    "m628s532m628s532m628s1320m628s1320m628s532m628s1320m628s532m628s532"
    "m628s532m628s1320m628s532m628s1320m628s532m628s1320m628s1320m628s532"
    "m628s532m628s1320m628s1320m628s1320m628s1320m628s532m628s532m628s532"
    "m628s20000", irsend.outputStr());
}

// Tests for decodeCarrierAC().

// Decode normal "synthetic" messages.
TEST(TestDecodeCarrierAC, NormalDecodeWithStrict) {
  IRsendTest irsend(0);
  IRrecv irrecv(0);
  irsend.begin();

  irsend.reset();
  irsend.sendCarrierAC(0x0);
  irsend.makeDecodeResult();
  ASSERT_TRUE(irrecv.decodeCarrierAC(&irsend.capture, CARRIER_AC_BITS, true));
  EXPECT_EQ(CARRIER_AC, irsend.capture.decode_type);
  EXPECT_EQ(CARRIER_AC_BITS, irsend.capture.bits);
  EXPECT_EQ(0x0, irsend.capture.value);
  EXPECT_EQ(0x0, irsend.capture.address);
  EXPECT_EQ(0x0, irsend.capture.command);
  EXPECT_FALSE(irsend.capture.repeat);

  irsend.reset();
  irsend.sendCarrierAC(0xB335ABE2);
  irsend.makeDecodeResult();
  ASSERT_TRUE(irrecv.decodeCarrierAC(&irsend.capture, CARRIER_AC_BITS, true));
  EXPECT_EQ(CARRIER_AC, irsend.capture.decode_type);
  EXPECT_EQ(CARRIER_AC_BITS, irsend.capture.bits);
  EXPECT_EQ(0xB335ABE2, irsend.capture.value);
  EXPECT_EQ(0xB335, irsend.capture.address);
  EXPECT_EQ(0xABE2, irsend.capture.command);
  EXPECT_FALSE(irsend.capture.repeat);

  // Do the last one again, & use the full decoder, not just protocol specific.
  irsend.reset();
  irsend.sendCarrierAC(0xB335ABE2);
  irsend.makeDecodeResult();
  ASSERT_TRUE(irrecv.decode(&irsend.capture));
  EXPECT_EQ(CARRIER_AC, irsend.capture.decode_type);
  EXPECT_EQ(CARRIER_AC_BITS, irsend.capture.bits);
  EXPECT_EQ(0xB335ABE2, irsend.capture.value);
}

// Decode a "real" example message.
TEST(TestDecodeCarrierAC, RealExamples) {
  IRsendTest irsend(0);
  IRrecv irrecv(0);
  irsend.begin();

  irsend.reset();
  // Data from Issue #385 captured by gnkarn
  uint16_t rawData[203] = {
      8532, 4216, 628, 1312, 628, 528, 628, 1312, 628, 1312, 628, 528, 628, 524,
      628, 1316, 624, 1316, 628, 524, 628, 528, 628, 1312, 628, 1316, 624, 528,
      628, 1312, 628, 528, 628, 1312, 628, 1312, 628, 528, 628, 1316, 624, 528,
      628, 1312, 628, 528, 628, 1312, 628, 1316, 624, 1316, 628, 1312, 628,
      1316, 628, 524, 628, 528, 628, 528, 624, 1316, 628, 528, 628, 20064, 8504,
      4228, 628, 528, 628, 1312, 628, 528, 628, 528, 628, 1312, 628, 1316, 624,
      532, 624, 528, 628, 1316, 628, 1312, 628, 528, 628, 528, 628, 1312, 628,
      528, 628, 1316, 628, 528, 624, 528, 628, 1316, 628, 528, 628, 1316, 624,
      528, 628, 1316, 628, 528, 624, 532, 624, 528, 628, 528, 628, 528, 628,
      1316, 624, 1316, 628, 1316, 628, 528, 624, 1316, 628, 20076, 8528, 4212,
      624, 1316, 628, 528, 628, 1316, 628, 1316, 624, 528, 628, 528, 628, 1316,
      628, 1316, 628, 528, 624, 532, 624, 1316, 628, 1316, 628, 528, 628, 1316,
      624, 528, 628, 1316, 628, 1316, 628, 528, 628, 1316, 624, 532, 624, 1316,
      628, 532, 624, 1316, 628, 1316, 624, 1320, 624, 1316, 628, 1316, 628, 528,
      628, 528, 628, 528, 628, 1316, 624, 532, 624};

  irsend.sendRaw(rawData, 203, 38000);
  irsend.makeDecodeResult();
  ASSERT_TRUE(irrecv.decode(&irsend.capture));
  EXPECT_EQ(CARRIER_AC, irsend.capture.decode_type);
  EXPECT_EQ(CARRIER_AC_BITS, irsend.capture.bits);
  EXPECT_EQ(0xB335ABE2, irsend.capture.value);
  EXPECT_EQ(0xB335, irsend.capture.address);
  EXPECT_EQ(0xABE2, irsend.capture.command);
  EXPECT_FALSE(irsend.capture.repeat);
}
